package com.gxa.common.utils;


import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;


import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * <mybatisplus.version>3.4.2</mybatisplus.version>
 *         <dependency>
 *             <groupId>com.baomidou</groupId>
 *             <artifactId>mybatis-plus-boot-starter</artifactId>
 *             <version>${mybatisplus.version}</version>
 *             <exclusions>
 *                 <exclusion>
 *                     <groupId>com.baomidou</groupId>
 *                     <artifactId>mybatis-plus-generator</artifactId>
 *                 </exclusion>
 *             </exclusions>
 *         </dependency>
 *
 *         <dependency>
 *             <groupId>com.baomidou</groupId>
 *             <artifactId>mybatis-plus-generator</artifactId>
 *             <version>3.5.2</version>
 *         </dependency>
 *
 *         <dependency>
 *             <groupId>org.springframework.boot</groupId>
 *             <artifactId>spring-boot-starter-freemarker</artifactId>
 *         </dependency>
 * 依赖要两个 ：spring-boot-starter-freemarker  和  mybatis-plus-generator
 * 如果开启了 swagger 再加一个 swagger的依赖
 * 1.注意第一次生成后 ，就记得切换注释使用（标注11,22的地方）   方便你操作
 * 2.System.getProperty("user.dir") 获取的是你项目工程目录 ，你要看需要看是否需要在两个输出路径添加一层xx_module
 * 解释：
 * <----------------- 代表你可能要修改的地方
 * <--------11--------- <--------22---------代表这里互相注释 方便你切换的地方
 */
public class MybatisPlusGenerator {
    public static void main(String[] args) {
        try {
                    // 用于存放数据库所有表名,"t_department","t_schedule"
            List<String> tableList = Arrays.asList("t_book_hs_check","t_book_phy_check","t_book_refund","t_book_register");//<---------------------------------------

                    //1、配置数据源<---------------------------------------
            FastAutoGenerator.create("jdbc:mysql://114.132.186.79:3306/appoint?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai", "appoint", "147258")
                    //2、全局配置
                    .globalConfig(builder -> {
                        builder.author("zhuiyi") // 设置作者<---------------------------------------
//                            .outputDir(System.getProperty("user.dir") +"/xx_module/src/main/java")
                                .outputDir(System.getProperty("user.dir") +"/src/main/java")// 输出路径<---------------------------------------
                                .commentDate("yyyy-MM-dd hh:mm:ss")//注释日期格式 默认yyyy-MM-dd
                                .dateType(DateType.ONLY_DATE)   //定义生成的实体类中日期的类型 TIME_PACK=LocalDateTime;ONLY_DATE=Date;
                                .fileOverride()   //覆盖之前的文件  默认值:false(不覆盖）
                                .disableOpenDir()  //禁止打开输出目录，默认打开
                                .enableSwagger();  //开启 swagger 模式
                    })
                    //3、包配置
                    .packageConfig(builder -> {
                        builder
//                                .parent("com.gxa") // 设置父包名<-------------------11--------------------
//                                .moduleName("modules.app") // 设置父包模块名 如sys系统模块<-----------------11----------------------
                                .parent("generator") // 设置父包名<--------------------22-------------------
                                .entity("entity")   //pojo 实体类包名
                                .service("service") //Service 包名
                                .serviceImpl("service.impl") // ***ServiceImpl 包名
                                .mapper("mapper")   //Mapper 包名
                                .xml("mapper.xml")  //Mapper XML 包名
                                .controller("controller") //Controller 包名
//                            .pathInfo(Collections.singletonMap(OutputFile.mapper.xml, System.getProperty("user.dir") + "/xx_module/src/main/resources/mapper"));
                                //mapper.xml输出路径<---------------------11-------------------
//                                .pathInfo(Collections.singletonMap(OutputFile.mapper.xml,System.getProperty("user.dir")+"/src/main/resources/mapper"));
                                //mapper.xml输出路径<---------------------22-------------------
                                .pathInfo(Collections.singletonMap(OutputFile.mapper.xml,System.getProperty("user.dir")+"/src/main/java/generator/mapper-xml"));

                    })
                    //4、策略配置
                    .strategyConfig(builder -> {
                        builder
                                .enableCapitalMode()    //开启大写命名
                                .enableSkipView()   //创建实体类的时候跳过视图
                                .addInclude("t_book_hs_time_num") //设置需要生成的表名<----------------11-----------------------如果生成所有的表，用下面的就行，这里要注释
//                                .addInclude(tableList) // 设置需要生成的表名<---------------------22------------------如果只是生成一张表，用上面的即可，这里要注释
                                .addTablePrefix("t_","sys_") // 设置过滤表前缀
                                //4.1、实体类策略配置
                                .entityBuilder()
                                .enableChainModel() //开启链式模型
                                //.disableSerialVersionUID()  //默认是开启实体类序列化，可以手动disable使它不序列化。由于项目中需要使用序列化就按照默认开启了
                                .enableTableFieldAnnotation()       // 开启生成实体时生成字段注解
                                .enableLombok() //开启 Lombok
                                .versionColumnName("version")   //乐观锁字段名(数据库)
                                .versionPropertyName("version") //乐观锁属性名(实体)
                                .logicDeleteColumnName("is_deleted")   //逻辑删除字段名(数据库)<---------------------------------------
                                .logicDeletePropertyName("isDeleted")  //逻辑删除属性名(实体) <---------------------------------------
                                .naming(NamingStrategy.underline_to_camel)  //数据库表映射到实体的命名策略：默认是下划线转驼峰命。这里可以不设置
                                .columnNaming(NamingStrategy.underline_to_camel)//数据库表字段映射到实体的命名策略：下划线转驼峰命。（默认是和nochange不改变，所以也可以不设置）
                                .addTableFills(
                                        new Column("create_time", FieldFill.INSERT),//<---------------------------------------
                                        new Column("update_time", FieldFill.INSERT_UPDATE)//<---------------------------------------
                                )   //添加表字段  自动填充，"create_time"字段自动填充为插入时间，"update_time"字段自动填充为插入修改时间
                                .idType(IdType.AUTO)    //设置主键自增


                                //4.2、Controller策略配置
                                .controllerBuilder()
                                .enableHyphenStyle()    //开启驼峰连转字符
                                .formatFileName("%sController") //格式化 Controller 类文件名称，%s进行匹配表名，如 UserController
                                .enableRestStyle()  //开启生成 @RestController 控制器

                                //4.3、service 策略配置
                                .serviceBuilder()
                                .formatServiceFileName("%sService") //格式化 service 接口文件名称，%s进行匹配表名，如 UserService
                                .formatServiceImplFileName("%sServiceImpl") //格式化 service 实现类文件名称，%s进行匹配表名，如 UserServiceImpl

                                //4.4、Mapper策略配置
                                .mapperBuilder()
                                .superClass(BaseMapper.class) //设置父类
                                .enableBaseResultMap()  //启用 BaseResultMap 生成
                                .enableBaseColumnList() //启用 BaseColumnList
                                .formatMapperFileName("%sMapper")   //格式化 mapper 文件名称
                                .enableMapperAnnotation()       //开启 @Mapper 注解
                                .formatXmlFileName("%sMapper") //格式化Xml文件名称
                                .formatMapperFileName("%sMapper");   //格式化Mapper文件名称

                    })
                    //5、模板
//                     .templateEngine(new VelocityTemplateEngine())
//                    模板引擎配置，默认 Velocity 可选模板引擎 Beetl 或 Freemarker(以下两个引擎用哪个就保留哪个)
//                   .templateEngine(new BeetlTemplateEngine())
                    .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                    .execute();
        } catch (Exception e) {
            System.out.println("代码生成失败！！！");
            e.printStackTrace();

        }
    }
}